其他
执行系统指令:小如麻雀的函数
再给大家介绍一下yulab.utils
包中的一个小函数。小到只有几行,但是非常方便。
首先安装包是:
install.packages('yulab.utils')
装好之后,加载:
library(yulab.utils)
然后就可以使用了,这次给大家介绍的是exec()
函数,它能够运行系统命令。假设你在使用R的时候,想跑一下命令行程序,切换终端总是有点不爽是吧?那么你就可以在R里面运行它,这个不难,用system()
指令。exec()
也是调用一句system()
来干这活。但我给它搞得稍微方便一点,仅此而已。
使用就是把指令传给它,比如用ls
列出文件,输出会直接打印出来:
> exec('ls -l')
total 32
-rw-r--r-- 1 HUAWEI HUAWEI 1157 Oct 6 10:34 DESCRIPTION
-rw-r--r-- 1 HUAWEI HUAWEI 953 Jun 20 10:26 Makefile
-rw-r--r-- 1 HUAWEI HUAWEI 1562 Aug 5 16:05 NAMESPACE
-rw-r--r-- 1 HUAWEI HUAWEI 4054 Oct 6 10:35 NEWS.md
drwxr-xr-x 1 HUAWEI HUAWEI 0 Oct 6 10:32 R
-rw-r--r-- 1 HUAWEI HUAWEI 1631 Jun 5 15:53 README.Rmd
-rw-r--r-- 1 HUAWEI HUAWEI 1854 Jun 5 15:53 README.md
drwxr-xr-x 1 HUAWEI HUAWEI 0 Sep 13 14:23 inst
drwxr-xr-x 1 HUAWEI HUAWEI 0 Sep 13 14:23 man
如果我想把输出存起来呢?因为我可能从输出中抽取出想要的信息,直接赋值就好了:
x <- exec('ls -l')
每一行输出是一个字符串:
> x[1]
[1] "total 32"
> x[2]
[1] "-rw-r--r-- 1 HUAWEI HUAWEI 1157 Oct 6 10:34 DESCRIPTION"
> x[3]
[1] "-rw-r--r-- 1 HUAWEI HUAWEI 953 Jun 20 10:26 Makefile"
那么我就可以用正则表达式去抽取结果了,比如我想把修改文件的时间拿出来:
sub(".*(\\w{3}\\s+\\d{1-2}).*", "\\1", x[-1])
[1] "Oct 6" "Jun 2" "Aug 5" "Oct 6" "Oct 6" "Jun 5" "Jun 5" "Sep 1"
[9] "Sep 1"
当然另一种做法是我把结果给整理了,变成格式化的输出,然后想要啥就直接拿啥,比如当前这个例子,显然就可以用空白来分割出字段,让我们试试:
> strsplit(x[2:3], "\\s+")
[[1]]
[1] "-rw-r--r--" "1" "HUAWEI" "HUAWEI" "1157"
[6] "Oct" "6" "10:34" "DESCRIPTION"
[[2]]
[1] "-rw-r--r--" "1" "HUAWEI" "HUAWEI" "953"
[6] "Jun" "20" "10:26" "Makefile"
那么全部一起上,再规整一下,下面这个直接就是输出一个矩阵了,想要啥,直接就是下标去取了。
> strsplit(x[-1], "\\s+") |> rbindlist()
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] "-rw-r--r--" "1" "HUAWEI" "HUAWEI" "1157" "Oct" "6" "10:34"
[2,] "-rw-r--r--" "1" "HUAWEI" "HUAWEI" "953" "Jun" "20" "10:26"
[3,] "-rw-r--r--" "1" "HUAWEI" "HUAWEI" "1562" "Aug" "5" "16:05"
[4,] "-rw-r--r--" "1" "HUAWEI" "HUAWEI" "4054" "Oct" "6" "10:35"
[5,] "drwxr-xr-x" "1" "HUAWEI" "HUAWEI" "0" "Oct" "6" "10:32"
[6,] "-rw-r--r--" "1" "HUAWEI" "HUAWEI" "1631" "Jun" "5" "15:53"
[7,] "-rw-r--r--" "1" "HUAWEI" "HUAWEI" "1854" "Jun" "5" "15:53"
[8,] "drwxr-xr-x" "1" "HUAWEI" "HUAWEI" "0" "Sep" "13" "14:23"
[9,] "drwxr-xr-x" "1" "HUAWEI" "HUAWEI" "0" "Sep" "13" "14:23"
[,9]
[1,] "DESCRIPTION"
[2,] "Makefile"
[3,] "NAMESPACE"
[4,] "NEWS.md"
[5,] "R"
[6,] "README.Rmd"
[7,] "README.md"
[8,] "inst"
[9,] "man"